#include <stdio.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <error.h>

#define BUF_SIZE 100

int main(int argc, char *argv[])
{
	int fd, nread, i;
	struct stat sb;
	char * mapped, buf[BUF_SIZE];

	for(i=0; i<BUF_SIZE; i++)
	{
		buf[i] = '#';
	}

	/* 打开文件 */
	if((fd = open(argv[1], O_RDWR)) < 0 )
	{
		perror("open");
	}

	/* 获取文件属性 */
	if((fstat(fd, &sb)) < 0)
	{
		perror("fstat");
	}

	/* 将文件映射到进程的地址空间，注意私有映射不会修改文件 */
	if((mapped = (char *)mmap(NULL, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == (char *)-1)
	{
		perror("mmap");
	}

	/* 映射完后，关闭文件也可以操纵内存 */
	close(fd);

	printf("mapped :\n %s\n", mapped);

	/* 修改一个字符，同步到磁盘上去 */
	i = 0;
	
	for(i=0; i<5; i++)
	{
		mapped[i] = buf[i];
	}
	
	
	
	mapped[20];

	if((msync((void *)mapped, sb.st_size, MS_SYNC)) == -1)
	{
		perror("msync");
	}


	/* 释放存储映射区 */
	if((munmap((void *)mapped, sb.st_size)) == -1)
	{
		perror("munmap");
	}

	return 0;
}
